import { createAlova } from 'alova'
import GlobalFetch from 'alova/GlobalFetch'
import vueHook from 'alova/vue'
import { useAuthStore } from '@/stores/user-auth'

const baseUrl = import.meta.env.SP_SERVER_HOST

export const httpClient = createAlova({
  baseURL: baseUrl,
  statesHook: vueHook,
  requestAdapter: GlobalFetch(),
  async beforeRequest(method) {
    const auth = useAuthStore()
    const uid = auth.state.userInfo?.uid
    const idToken = auth.state.userInfo?.idToken
    const appCheckToken = auth.state.appCheckToken

    method.config.headers['Store'] = 'Web'
    method.config.headers['Accept-Language'] = /*navigator.language*/'en'
    method.config.headers['Device-Id'] = '0000000000000000'

    appCheckToken && (method.config.headers ['App-Check-Token'] = appCheckToken)
    uid && (method.config.headers['UID'] = uid)
    idToken && (method.config.headers['Id-Token'] = idToken)
  },
  responded: {
    // 请求成功的拦截器
    // 当使用GlobalFetch请求适配器时，第一个参数接收Response对象
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    onSuccess: async (response, method) => {
      if (response.status >= 400) {
        throw new Error(response.statusText)
      }
      const json = await response.json()
      if (!json) {
        // 抛出错误或返回reject状态的Promise实例时，此请求将抛出错误
        throw new Error(json.message)
      }

      // 解析的响应数据将传给method实例的transformData钩子函数，这些函数将在后续讲解
      return json
    },
    // 请求失败的拦截器
    // 请求错误时将会进入该拦截器。
    // 第二个参数为当前请求的method实例，你可以用它同步请求前后的配置信息
    // 由于window.fetch的特点，只有在连接超时或连接中断时才会触发onError拦截器
    onError: (err, method) => {
    }
  }
})
